home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
cpptask.exe
/
TSKBIOS.ASM
< prev
next >
Wrap
Assembly Source File
|
1991-07-26
|
4KB
|
270 lines
;
; CTask - BIOS INT 15 interrupt handler (IBM AT specific)
;
; Public Domain Software written by
; Thomas Wagner
; Patschkauer Weg 31
; D-1000 Berlin 33
; West Germany
;
name tskbios
.model large
;
public _tsk_install_bios
public _tsk_remove_bios
;
include tsk.mac
;
intseg segment at 0
;
org 15h*4
pintofs dw ? ; interrupt entry
pintseg dw ?
intseg ends
;
;
.data?
;
extrn _ticks_per_sec: word
;
floppy flag <>
fdisk flag <>
kbd flag <>
;
.data
;
flag_tab label word
dw offset fdisk
dw offset floppy
dw offset kbd
;
;
.code
;
extrn _clear_flag_wait_set: far
extrn _set_flag: far
extrn _create_flag: far
extrn _delete_flag: far
extrn _t_delay: far
;
post_save label dword ; in CSEG to allow addressing
psofs dw ?
psseg dw ?
;
;----------------------------------------------------------------------
;
; interrupt handler
;
bios_int proc far
pushf
sti
cmp ah,90h ; WAIT
jb bios_pass
cmp ah,91h ; POST
ja bios_pass
cmp al,2 ; fdisk/floppy/keyboard
jbe process_bios
cmp ah,91h
je bios_pass
cmp al,0fdh ; floppy motor
jb bios_pass
cmp al,0feh ; printer
jbe process_bios
;
bios_pass:
popf
jmp cs:post_save
;
process_bios:
popf
sti
push es
push ds
push dx
push cx
push bx
push ax
mov bx,SEG dgroup
mov ds,bx
mov es,bx
;
cmp al,2
jbe flag_ops
;
cmp al,0fdh
je wait_motor
;
; wait for printer ready.
; delay for some ticks, then check printer.
; CAUTION: this assumes the BIOS is *truly* AT compatible,
; with the printer port address in DX on entry to INT15.
;
wait_prn:
push dx
mov ax,3
push ax
xor ax,ax
push ax
call _t_delay
add sp,4
pop dx
in al,dx
test al,80h
jz wait_prn
stc
;
bios_ret:
pop ax
pop bx
pop cx
pop dx
pop ds
pop es
ret 2
;
; Wait for diskette motor start (1 sec.)
;
wait_motor:
xor ax,ax
push ax
mov ax,_ticks_per_sec
push ax
call _t_delay
add sp,4
stc
jmp bios_ret
;
; Floppy/Fdisk/Keyboard wait/post
;
flag_ops:
xor bh,bh
mov bl,al
add bx,bx
mov bx,flag_tab[bx]
cmp ah,90h
je fl_wait
push ds
push bx
call _set_flag
add sp,4
clc
jmp bios_ret
;
fl_wait:
xor dx,dx
cmp al,2
je fl_dowait
mov dx,_ticks_per_sec
add dx,dx
cmp al,1
je fl_dowait
mov cx,dx
add dx,cx
add dx,cx
fl_dowait:
xor ax,ax
push ax
push dx
push ds
push bx
call _clear_flag_wait_set
add sp,8
cmp ax,0
je bios_ret
stc
jmp bios_ret
;
bios_int endp
;
;------------------------------------------------------------------------
;
; void far _tsk_remove_bios (void)
;
; This routine un-installs the int handler.
;
_tsk_remove_bios proc far
;
push es
xor ax,ax
mov es,ax
assume es:intseg
cli
mov ax,cs:psofs ; restore vector
mov pintofs,ax
mov ax,cs:psseg
mov pintseg,ax
sti
assume es:nothing
pop es
;
mov ax,offset floppy
push ds
push ax
call _delete_flag
add sp,4
;
mov ax,offset fdisk
push ds
push ax
call _delete_flag
add sp,4
;
mov ax,offset kbd
push ds
push ax
call _delete_flag
add sp,4
;
ret
;
_tsk_remove_bios endp
;
;----------------------------------------------------------------------
;
; void far _tsk_install_bios (void)
;
; This routine installs the int handler.
;
_tsk_install_bios proc far
;
mov ax,offset floppy
push ds
push ax
call _create_flag
add sp,4
;
mov ax,offset fdisk
push ds
push ax
call _create_flag
add sp,4
;
mov ax,offset kbd
push ds
push ax
call _create_flag
add sp,4
;
push es
xor ax,ax
mov es,ax ; establish addressing for intseg
assume es:intseg
;
mov ax,pintofs ; save old timer int addr
mov psofs,ax
mov ax,pintseg
mov psseg,ax
cli
mov pintofs,offset bios_int ; set new timer int addr
mov pintseg,cs
sti
assume es:nothing
pop es
ret
;
_tsk_install_bios endp
;
end